/**
 * 浏览器调试工具包的MCP集成
 * 提供浏览器自动化调试功能的MCP工具定义
 */

import type { ToolPackage } from '../../core/tool-registry.js';
import { createTool, field } from '../../core/tool-schema.js';
import { browserDebugTools } from './index.js';

/**
 * 启动浏览器调试服务
 */
const startBrowserDebug = createTool()
  .name('start_browser_debug')
  .title('启动浏览器调试')
  .description('启动浏览器调试服务，支持headed/headless模式和可视化网页调试')
  .version('1.1.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'debug', 'playwright', 'automation', 'headless'])
  .parameter(
    'viewport',
    field.optional(
      field.string({
        description: '视口类型',
        enum: ['desktop', 'tablet', 'mobile'],
      })
    )
  )
  .parameter(
    'theme',
    field.optional(
      field.string({
        description: '页面主题',
        enum: ['light', 'dark'],
      })
    )
  )
  .parameter(
    'mode',
    field.optional(
      field.string({
        description: '浏览器模式：headed(可视)或headless(无界面)',
        enum: ['headed', 'headless'],
      })
    )
  )
  .parameter(
    'devtools',
    field.optional(
      field.boolean({
        description: '是否开启开发者工具（仅headed模式有效）',
      })
    )
  )
  .parameter(
    'maximized',
    field.optional(
      field.boolean({
        description: '是否最大化窗口（仅headed模式有效）',
      })
    )
  )
  .build(async params => {
    const result = await browserDebugTools.start_browser_debug(params as any);
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 获取浏览器状态
 */
const getBrowserStatus = createTool()
  .name('get_browser_status')
  .title('获取浏览器状态')
  .description('检查浏览器运行状态和上下文信息')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'status', 'debug'])
  .build(async () => {
    const result = await browserDebugTools.get_browser_status();
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 重启浏览器
 */
const restartBrowser = createTool()
  .name('restart_browser')
  .title('重启浏览器')
  .description('重启浏览器实例，清理所有上下文和页面')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'restart', 'debug'])
  .build(async () => {
    const result = await browserDebugTools.restart_browser();
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 导航到URL
 */
const navigateToUrl = createTool()
  .name('navigate_to_url')
  .title('导航到URL')
  .description('在浏览器中导航到指定的URL地址')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'navigate', 'url', 'debug'])
  .parameter(
    'url',
    field.required(
      field.string({
        description: '要导航到的URL地址',
      })
    )
  )
  .parameter(
    'viewport',
    field.optional(
      field.string({
        description: '视口类型',
        enum: ['desktop', 'tablet', 'mobile'],
      })
    )
  )
  .parameter(
    'theme',
    field.optional(
      field.string({
        description: '页面主题',
        enum: ['light', 'dark'],
      })
    )
  )
  .parameter(
    'waitForLoad',
    field.optional(
      field.boolean({
        description: '是否等待页面完全加载（默认true）',
      })
    )
  )
  .build(async params => {
    const result = await browserDebugTools.navigate_to_url(params as any);
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 截图
 */
const takeScreenshot = createTool()
  .name('take_screenshot')
  .title('页面截图')
  .description('对当前页面进行截图，支持全页面或视口截图')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'screenshot', 'capture', 'debug'])
  .parameter(
    'viewport',
    field.optional(
      field.string({
        description: '视口类型',
        enum: ['desktop', 'tablet', 'mobile'],
      })
    )
  )
  .parameter(
    'theme',
    field.optional(
      field.string({
        description: '页面主题',
        enum: ['light', 'dark'],
      })
    )
  )
  .parameter(
    'type',
    field.optional(
      field.string({
        description: '截图类型',
        enum: ['viewport', 'fullpage'],
      })
    )
  )
  .parameter(
    'selector',
    field.optional(
      field.string({
        description: 'CSS选择器，截取特定元素（可选）',
      })
    )
  )
  .parameter(
    'waitMs',
    field.optional(
      field.number({
        description: '截图前等待时间（毫秒）',
      })
    )
  )
  .parameter(
    'quality',
    field.optional(
      field.number({
        description: '图片质量（0-100）',
      })
    )
  )
  .parameter(
    'filename',
    field.optional(
      field.string({
        description: '输出文件路径（可选，默认生成临时文件）',
      })
    )
  )
  .build(async params => {
    const result = await browserDebugTools.take_screenshot(params as any);
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 获取页面信息
 */
const getPageInfo = createTool()
  .name('get_page_info')
  .title('获取页面信息')
  .description('获取当前页面的详细信息，包括URL、标题、性能数据等')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'page', 'info', 'debug'])
  .parameter(
    'viewport',
    field.optional(
      field.string({
        description: '视口类型',
        enum: ['desktop', 'tablet', 'mobile'],
      })
    )
  )
  .parameter(
    'theme',
    field.optional(
      field.string({
        description: '页面主题',
        enum: ['light', 'dark'],
      })
    )
  )
  .build(async params => {
    const result = await browserDebugTools.get_page_info(params as any);
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 执行JavaScript代码
 */
const executeScript = createTool()
  .name('execute_script')
  .title('执行JavaScript')
  .description('在页面上下文中执行JavaScript代码并返回结果')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'javascript', 'execute', 'debug'])
  .parameter(
    'script',
    field.required(
      field.string({
        description: '要执行的JavaScript代码',
      })
    )
  )
  .parameter(
    'viewport',
    field.optional(
      field.string({
        description: '视口类型',
        enum: ['desktop', 'tablet', 'mobile'],
      })
    )
  )
  .parameter(
    'theme',
    field.optional(
      field.string({
        description: '页面主题',
        enum: ['light', 'dark'],
      })
    )
  )
  .parameter(
    'timeout',
    field.optional(
      field.number({
        description: '执行超时时间（毫秒）',
      })
    )
  )
  .build(async params => {
    const result = await browserDebugTools.execute_script(params as any);
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 注入CSS样式
 */
const injectCSS = createTool()
  .name('inject_css')
  .title('注入CSS样式')
  .description('向页面注入CSS样式代码')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'css', 'inject', 'debug'])
  .parameter(
    'css',
    field.required(
      field.string({
        description: '要注入的CSS代码',
      })
    )
  )
  .parameter(
    'viewport',
    field.optional(
      field.string({
        description: '视口类型',
        enum: ['desktop', 'tablet', 'mobile'],
      })
    )
  )
  .parameter(
    'theme',
    field.optional(
      field.string({
        description: '页面主题',
        enum: ['light', 'dark'],
      })
    )
  )
  .build(async params => {
    const result = await browserDebugTools.inject_css(params as any);
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 等待元素出现
 */
const waitForElement = createTool()
  .name('wait_for_element')
  .title('等待元素')
  .description('等待指定的CSS选择器元素出现在页面中')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'wait', 'element', 'debug'])
  .parameter(
    'selector',
    field.required(
      field.string({
        description: 'CSS选择器',
      })
    )
  )
  .parameter(
    'viewport',
    field.optional(
      field.string({
        description: '视口类型',
        enum: ['desktop', 'tablet', 'mobile'],
      })
    )
  )
  .parameter(
    'theme',
    field.optional(
      field.string({
        description: '页面主题',
        enum: ['light', 'dark'],
      })
    )
  )
  .parameter(
    'timeout',
    field.optional(
      field.number({
        description: '等待超时时间（毫秒）',
      })
    )
  )
  .parameter(
    'state',
    field.optional(
      field.string({
        description: '元素状态',
        enum: ['visible', 'hidden', 'attached', 'detached'],
      })
    )
  )
  .build(async params => {
    const result = await browserDebugTools.wait_for_element(params as any);
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 设置代理服务器
 */
const setProxy = createTool()
  .name('set_proxy')
  .title('设置代理')
  .description('为浏览器设置代理服务器，支持HTTP/HTTPS/SOCKS5代理')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'proxy', 'network', 'debug'])
  .parameter(
    'server',
    field.required(
      field.string({
        description: '代理服务器地址，格式如 http://127.0.0.1:7890 或 socks5://127.0.0.1:1080',
      })
    )
  )
  .parameter(
    'username',
    field.optional(
      field.string({
        description: '代理用户名（可选）',
      })
    )
  )
  .parameter(
    'password',
    field.optional(
      field.string({
        description: '代理密码（可选）',
      })
    )
  )
  .parameter(
    'bypass',
    field.optional(
      field.string({
        description: '绕过代理的地址，逗号分隔，如 "localhost,127.0.0.1,*.local"',
      })
    )
  )
  .build(async params => {
    const result = await browserDebugTools.set_proxy(params as any);
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 获取代理状态
 */
const getProxyStatus = createTool()
  .name('get_proxy_status')
  .title('查看代理状态')
  .description('获取当前浏览器代理配置状态')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'proxy', 'status', 'debug'])
  .build(async () => {
    const result = await browserDebugTools.get_proxy_status();
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 清除代理设置
 */
const clearProxy = createTool()
  .name('clear_proxy')
  .title('清除代理')
  .description('清除浏览器代理设置，恢复直连模式')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'proxy', 'clear', 'debug'])
  .build(async () => {
    const result = await browserDebugTools.clear_proxy();
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 设置浏览器运行模式
 */
const setBrowserMode = createTool()
  .name('set_browser_mode')
  .title('设置浏览器模式')
  .description('设置浏览器运行模式（headed/headless）、是否启用DevTools、是否最大化窗口')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'mode', 'headless', 'devtools', 'debug'])
  .parameter(
    'mode',
    field.optional(
      field.string({
        description: '浏览器模式：headed(可视)或headless(无界面)',
        enum: ['headed', 'headless'],
      })
    )
  )
  .parameter(
    'devtools',
    field.optional(
      field.boolean({
        description: '是否开启开发者工具（仅headed模式有效）',
      })
    )
  )
  .parameter(
    'maximized',
    field.optional(
      field.boolean({
        description: '是否最大化窗口（仅headed模式有效）',
      })
    )
  )
  .build(async params => {
    const result = await browserDebugTools.set_browser_mode(params as any);
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 获取浏览器运行模式
 */
const getBrowserMode = createTool()
  .name('get_browser_mode')
  .title('获取浏览器模式')
  .description('获取当前浏览器运行模式和窗口状态')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'mode', 'headless', 'devtools', 'debug'])
  .build(async () => {
    const result = await browserDebugTools.get_browser_mode();
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 关闭浏览器
 */
const closeBrowser = createTool()
  .name('close_browser')
  .title('关闭浏览器')
  .description('关闭浏览器实例并清理所有资源')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('浏览器调试')
  .tags(['browser', 'close', 'cleanup', 'debug'])
  .build(async () => {
    const result = await browserDebugTools.close_browser();
    return {
      success: result.success,
      data: result.success ? result.data : undefined,
      error: result.success ? undefined : result.error,
      message: result.message,
    };
  });

/**
 * 浏览器调试工具包
 */
export const browserDebugToolPackage: ToolPackage = {
  meta: {
    name: 'browser_debug',
    version: '1.0.0',
    description: '浏览器调试工具包，提供可视化浏览器自动化功能',
    author: 'Test Case Writer Team',
  },
  tools: [
    startBrowserDebug,
    getBrowserStatus,
    restartBrowser,
    navigateToUrl,
    takeScreenshot,
    getPageInfo,
    executeScript,
    injectCSS,
    waitForElement,
    setProxy,
    getProxyStatus,
    clearProxy,
    setBrowserMode,
    getBrowserMode,
    closeBrowser,
  ],
};
